package com.example.activiti7.domain.service;

import com.example.activiti7.domain.model.req.ActBizModelReq;
import com.example.activiti7.domain.model.req.DeployReq;
import com.example.activiti7.domain.model.req.QueryProcessDefinitionListReq;
import com.example.activiti7.domain.model.resp.Page;
import com.example.activiti7.domain.model.resp.Response;
import com.example.activiti7.domain.model.vo.ProcessDefinitionVO;
import com.fasterxml.jackson.databind.node.ObjectNode;
import org.activiti.engine.repository.Model;
import org.springframework.util.MultiValueMap;

public interface ProcessDefinitionService {
    /**
     * 流程设计器设计流程后，保存数据到流程设计部署表
     *
     * @param actModelReq 流程设计部署表对象
     * @return
     * @throws Exception
     */
    Response<Model> create(ActBizModelReq actModelReq) throws Exception;

    /**
     * 获取流程模型数据
     *
     * @param modelId 模型ID
     * @return
     * @throws Exception
     */
    ObjectNode getModelEditorJson(String modelId) throws Exception;

    /**
     * 流程设计器更新设计流程后，更新数据到流程设计部署表和流程设计部署扩展表
     *
     * @param modelId 流程设计部署表唯一表示
     * @param values  数据更新信息
     * @return
     * @throws Exception
     */
    boolean save(String modelId, MultiValueMap<String, String> values) throws Exception;

    /**
     * 流程设计器设计流程后，进行流程部署发布
     *
     * @param deployReq
     * @return
     * @throws Exception
     */
    Response<Boolean> deploy(DeployReq deployReq) throws Exception;

    /**
     * 根据流程发布ID进行数据删除
     *
     * @param deployId 流程发布ID
     * @param cascade  级联删除，如果存在流程实例数据，流程实例数据也会进行删除
     * @return
     * @throws Exception
     */
    Response<Boolean> deleteByDeployId(String deployId, boolean cascade);

    /**
     * 根据流程设计模型Id进行数据删除
     *
     * @param modelId 流程设计模型Id
     * @param cascade 级联删除，如果存在流程实例数据，流程实例数据也会进行删除
     * @return
     * @throws Exception
     */
    Response<Boolean> deleteByModelId(String modelId, boolean cascade);

    /**
     * 查询流程定义信息列表
     *
     * @param req
     * @return
     */
    Response<Page<ProcessDefinitionVO, QueryProcessDefinitionListReq>> queryProcessDefinitions(QueryProcessDefinitionListReq req);
}
